<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 1、创建一个新对象
    // 2、将构造函数的作用域赋值给新对象（this指向这个新对象）
    // 3、执行构造函数中的代码（为这个新对象添加属性）
    // 4、返回新对象
    function Person(name) {
      this.name = name
    }
    function _new() {
      let target = {}
      let [constructor, ...args] = [...arguments]   // 第一个参数是构造函数
      // 2、原型链连接
      target.__proto__ = constructor.prototype
      // 3、将构造函数的属性和方法添加到这个新的空对象上。
      let result = constructor.apply(target, args)
      if (result && (typeof result === 'objecct' || typeof result === 'function')) {
        return result
      }
      return target
    }

    let p2 = _new(Person, '小花')
    console.log(p2.name)
    console.log(p2 instanceof Person)

    // 第二种实现方式
    function _new2(obj, ...args) {
      const target = Object.create(obj.prototype)
      const result = obj.apply(target, args)
      if (result && (typeof result === 'objecct' || typeof result === 'function')) {
        return result
      }
      return target
    }
  </script>
</body>

</html>
